<template>
  <div v-cloak id="wrapper">
    <!-- 头部组件 -->
    <Header :headerInfo="componentInfoHeader" :historyInfo="history" @showHistory="showHistory" @save="save" @repulseMark="repulse" @submit="submitResult" @closeVersion="closeVersion" @recoverVersion="recoverVersion(null)" />
    <!-- 历史弹窗组件 -->
    <HistoryPopup :hisPopupShow="history.show" :historyList="history.list" @viewVersion="viewVersion" @recoverVersion="recoverVersion" @closeHisPopup="history.show = false" />
    <!-- 中间控制条组件 -->
    <CenterControl v-if="files.current" :allFiles="files.allInfo" :currentFile="files.current" :currentFileId="files.current.index * 1 + 1" 
    :filesType="files.showType" pageType="mark" @changeFileList="changeFileList" @selectDataListType="selectDataListType" 
    @preTask="preTask" @nextTask="nextTask" @markBadData="markBadData" @hideHeader="hideHeader" />
    <!-- 左侧文件列表组件 -->
    <FileList v-if="files.current" :listShow="listShow" :showList="files.showList" :currentId="files.current.id" @skipFile="skipFile" :arrowShow="arrowShow" />
    <!-- 标注主体组件 -->
    <MarkContent ref="MarkContent" 
      :files="files" 
      :base="base" 
      :history="history" 
      :arrowShow="arrowShow"
      :markContent="markContent" 
      :componentsInfo="components" />
  </div>
</template>

<script>
import Header from "@/components/mark/Header";
import CenterControl from "@/components/mark/centerControl";
import FileList from "@/components/mark/FileList";
import HistoryPopup from "@/components/mark/HistoryPopup"
import MarkContent from "@/components/mark/MarkContent"
// shortcutsArr 快件配置项
import { shortcutsArr } from '@/assets/js/ass_config'

let self = null;
let svg = null;
export default {
  name: "MarkPage",
  data() {
    return {
      base: {
        batchId: "",
        taskId: "",
        markTaskId: "",
        recheck: null,
        step: 0
      },
      // 头部组件参数
      componentInfoHeader: {
        curName: "", // 文件名
        standardBtnShow: true, // 标注规范显示
        standardCnt: "", // 标注规范内容
        abandonBtnShow: false, // 重新认证按钮显示
        repulseBtnShow: false, // 打回按钮显示
        isRecheck: false, // 是否是复检环节
        saveBtnShow: true, // 保存按钮显示
        historyBtnShow: true, // 历史按钮显示
        shortcutBtnShow: true, //  快捷键展示
        submitBtnShow: true,
        shortcutkeys: shortcutsArr, // 快捷键配置
      },
      files: {
        lastIndex: 0, // 上次标注的文件索引
        allInfo: [], // 全部数据
        current: null, // 当前的数据
        curIndex: 0, // 当前数据的id
        showType: 1, // 1 表示全部 2 表示好数据，3表示坏数据，4表示未标注
        showList: [],
      },
      history: {
        show: false, //历史弹窗界面显示
        list: [], //历史文件列表
        allList: [],
        curIndex: 0,
        showVersionInfo: false, // 历史显然界面显示(click查看历史btn,弹框消失后，历史展示界面，主要关联头部按钮显示)
        curFiles: null, //当前选中历史记录的文件对象
        hidePop: false,
        submitsuccess: false
      },
      markContent: {
        checkType: {}, //// 要从外面传
        fastInsertTxtObj: {},  // 要从外面传
        requiredLabel: true, // 标签是否必选
        isTranscription: true,  // 是否必选转写
        isPointLabel: true, // 必须给点打标签
      },
      arrowShow: false, // 隐藏头部标示
      listShow: false, // 隐藏左侧文件列表标示
      operate: {
        autoSaveInterval: null, // 定时器自动保存
        isKeydownPrepare: true // 输入框是否获取焦点，默认没有
      },
      interactive: {
        saveSuccess: true, // 当前数据保存是否成功
      }, // 交互相关  
      components: {}, // 组件信息
      saveCheckType: 0, // 0 校验失败 1校验成功
    };
  },
  // 同步原始数据拉取
  async created() {
    self = this;
    // url带过来的参数对象
    let urlArgs = this.Utils.getQueryStringArgs()

    this.base.taskId = urlArgs["taskId"];
    this.base.markTaskId = urlArgs["markTaskId"];

    if (urlArgs.recheck === "recheck") {
      this.base.recheck = 1;
    } else {
      this.base.recheck = 0;
    }
    // const getFileListPromise = self.ass_api.getFileListNew({
    //     // 复检功能
    //     markTaskId: self.base.markTaskId,
    //     markFileId: "all",
    //     recheck: self.base.recheck
    // });
    // await getFileListPromise.then(this.getFileCallBack);

    // 获取原始数据
    let mokeInfo = `{"pageElement":{"originalLng":"CN","targetLng":"EN","isCopy":true,"isTerm":true},"markName":"nn文本翻译_nn文本翻译1111_B046066","files":[{"extend":{"user":{"reference": "I bought the fruit","resultText": "I bought the fruit","sourceText": "我我买的水果"}},"isBad":0,"name":"中文翻译英文大数据.xlsx-36","machineText":{"reference":"I bought the fruit, and you can see that I bought the best.","resultText":"I bought the fruit, and you can see that I bought the best.","sourceText":"我我买的水果，你就可以看出我是买的最好的。","id":"36"},"id":"0","defaultResult":{"reference":"I bought the fruit, and you can see that I bought the best.","resultText":"I bought the fruit, and you can see that I bought the best.","sourceText":"我我买的水果，你就可以看出我是买的最好的。","id":"36"},"status":0},{"extend":{"user":{"reference": "I bought the fruit","resultText": "I bought the fruit","sourceText": "我我买的水果"}},"isBad":0,"name":"中文翻译英文大数据.xlsx-37","machineText":{"reference":"Hello, I'm going to the United States, but my English is not very good.","resultText":"Hello, I'm going to the United States, but my English is not very good.","sourceText":"嗯你好，我要去美国了，但是我英语不太好。","id":"37"},"id":"1","defaultResult":{"reference":"Hello, I'm going to the United States, but my English is not very good.","resultText":"Hello, I'm going to the United States, but my English is not very good.","sourceText":"嗯你好，我要去美国了，但是我英语不太好。","id":"37"},"status":0}],"step":0,"markTaskId":"985807FBA7114FA5A940F1F9508AF855","lastIndex":0,"markStandard":"<p>sdas dfs f</p>","batchId":"B526912D90944C658C32E5851BEA2C0F","lastMarkTaskId":""}`
    let saveInfo = `{"lastIndex":"0","result":{"markTaskFileId":"0","batchId":"B526912D90944C658C32E5851BEA2C0F","markTaskId":"985807FBA7114FA5A940F1F9508AF855","stamp":0,"isCheck":false,"resultText":"{\"1577257870464\":{\"value\":\"\"},\"1577257884384\":{\"value\":\"我我买的水果1\"},\"1577257903098\":{\"value\":\"\"},\"1577257909996\":{\"value\":\"\"},\"1577257919100\":{\"value\":\"\"},\"1577257923179\":{\"value\":\"I bought the fruit2\"}}","autoSave":false}}`
    // 获取组件信息
    const componentPath = await this.ass_api.getComponentsInfo({ id: '5e030d4b7c5f36000163b28a' })

    let path = componentPath && componentPath.path

    let components = await this.ass_api.$axios(path, 'GET', {})
    this.components = components

    this.getFileCallBack(mokeInfo);
    // 快捷键事件绑定
  },
  mounted() {
  },
  computed: {
    // 返回好数据 怀数据 已标注 未标注 文件数量
    fileLength() {
      var dataL = [0, 0, 0, 0];
      if (!this.files || !this.files.allInfo) {
        return dataL;
      }
      let { allInfo } = this.files
      var len = allInfo.length;
      dataL[0] = len;

      allInfo.forEach(info => {
        let { isBad, status } = info
        if (isBad === 0) {//好数据
          dataL[1]++;
        }
        if (isBad === 1) {// 坏数据
          dataL[2]++;
        }
        if (status === 0) {// 未标注
          dataL[3]++;
        }
      })

      return dataL;
    },
    // 是否在操作历史
    isOperationHistory() {
      return (this.history.showVersionInfo || this.history.show)
    }
  },
  methods: {
    getFileCallBack(info) {
      if (!info) return;
      info = JSON.parse(info);
      let { step, files, markName, markStandard, batchId, markTaskId, pageElement, lastIndex } = info
      // 判断当前标注环节
      if (!(step == 0 || step == 1 || step == 2)) return self.ui.error("获取文件异常");
      // 判断文件数量
      if (files.length == 0) return self.ui.error("获取文件个数为0");

      // 基础数据设置
      this.base.step = step;
      this.base.batchId = batchId;
      this.base.markTaskId = markTaskId;

      // 设置头部数据
      this.componentInfoHeader.curName = markName; // 文件名
      this.componentInfoHeader.standardCnt = markStandard; // 标注规范

      // 打回和保存按钮显示
      if (step === 1) {
        // 检查环节有打回
        if (!this.base.recheck) { // 0
          // 显示打回按钮
          this.componentInfoHeader.repulseBtnShow = true;
        } else { // 1
          this.componentInfoHeader.isRecheck = true;
        }
      } else if (step === 2) {
        if (!this.base.recheck) {
          // 显示打回按钮
          this.componentInfoHeader.repulseBtnShow = true;
        } else {
          this.componentInfoHeader.isRecheck = true;
        }
      }

      /**
       * 标注数据
       */
      // let { requiredLabel, isTranscription, isPointLabel} = pageElement
      // self.markContent.requiredLabel = requiredLabel; // 是否必选标签
      // self.markContent.isTranscription = isTranscription; // 是否必选转写
      // self.markContent.isPointLabel = isPointLabel; // 是否给点打标签

      if (step == 0) {
        document.title = "文本翻译标注"
      } else if (step == 1) {
        document.title = "文本翻译检查"
      } else if (step == 2) {
        document.title = "文本翻译质检"
      }

      this.initFiles(files, lastIndex * 1);
    },
    /**
     * 数据初始化 将数据解析处理成本地使用数据
     * @param files 领取的所有文件
     * @param lastIndex 当前标注的文件索引
     */
    initFiles(files, lastIndex) {
      // 遍历循环全部数据
      let curIndex = 0;
      files.forEach((item, ind) => {
        if (!item) return;
        let { defaultResult, extend, isBad, name, id, status } = item
        self.files.allInfo.push({ // 文件不为空 直接赋值到全部数据
          result: defaultResult, //
          extend, // 供初始数据使用
          isBad,
          name,
          id,
          index: item.id,
          status,
          isDefaultData: true // 是否是原始数据 自定义标注组件使用
        });
        if (item.id * 1 === lastIndex * 1) {
          curIndex = ind;
        }
      });
      self.selectDataListType(1, curIndex); // 选择数据列表类型 初始化默认选择全部数据 1
    },
    /**
      *  选择区域数据
      * @param type 1 全部数据 2 好数据 3 坏数据 4 未标注
      * @param lastIndex 当前标注第几条
      */
    selectDataListType(type, lastIndex) {
      // 显示历史弹窗时 禁止切换
      if (this.isOperationHistory) return;
      // 没有对应的数据时
      if (this.fileLength[type - 1] === 0) return;

      if (isNaN(Number(lastIndex))) {
        // 如果 lastIndex 无非转换成数字 默认0
        lastIndex = 0;
      }

      self.files.showType = type;

      let { allInfo } = this.files
      let showList = []
      if (type === 1) {// 全部数据
        showList = allInfo;
      } else {
        allInfo.forEach(item => {
          let { isBad, status } = item
          if (isBad === 0 && type === 2) {  // 好数据
            showList.push(item);
          } else if (isBad === 1 && type === 3) {   // 坏数据
            showList.push(item);
          } else if (status === 0 && type === 4) {  // 未标注
            showList.push(item);
          }
        })
      }
      // 设置上下条任务
      showList.forEach((file, ind, list) => {
        file.last = ind == 0 ? null : list[ind - 1];
        file.next = ind == list.length - 1 ? null : list[ind + 1];
      })

      self.files.showList = showList; // 给当前类型列表赋值
      // 选择处理单个文件数据
      self.selectFile(self.files.showList[lastIndex]);
    },
    /**
     * 选择单个文件
     * @param item 当前条的数据
     */
    async selectFile(item) {
      if (this.Utils.isNull(item)) {
        this.files.curIndex = -1;
        this.$set(this.files, "current", {});
        return false;
      } // 如果空 返回

      this.files.curIndex = item.id;

      // 这里先赋值 数据
      this.$set(this.files, "current", item);
      this.initFile(item);
    },

    /**
     * 初始化单个文件
     * @param item
     */
    async initFile(item) {
      // 判断是否获取最新结果 并初当前加载参数
      await this.getCurResult(item);
      this.$bus.$emit('initFile', item) // 通知子组件 重置组件
    },
    /**
     * 从结果服务中获取是否存在新的结果
     * @param file
     */
    async getCurResult(file) {
      return;
      if (file.isInit === 1) return false; // 如果文件 isInit为 1 说明页面刷新后已经从结果拉去过一次
      // 表示需要获取最新的标注数据
      const info = await this.ass_api.getCurrentResult(
        self.base.taskId,
        self.base.markTaskId,
        file.id
      );
      if (!info) return;
      var curInfo = JSON.parse(info.resultText);
      var extend = info.extend;
      file.isDefaultData = false;
      file.result = curInfo;
      file.isBad = extend.stamp;
      file.isInit = 1;
      file.lastSubmit = {
        result: "", // JSON.stringify(self.arrToObject(file.result, false)),
        isLastAuto: info.autoSave
      };
    },

    async showHistory() {
      this.$refs.MarkContent.$emit('showHistory')
      let { result, id } = self.getFile()
      if (!result) {
        return self.ui.error("无任务");
      }
      this.history.list = [];
      var fileId = id;
      let info = await this.ass_api.getHistoryList(self.base.taskId, self.base.markTaskId, fileId)
      if (!info) return;

      info.forEach(item => {
        self.history.list.unshift(item);
      })

      // self.$refs.MarkContent.$emit('setClick', "svgImage")
      self.history.show = true;
    },
    /**
     * 跳转到某一条数据
     * @param item 数据
     * @param force 是否强制跳转 ，如果true 则可以跳到未标注的数据上
     * @returns {boolean}
     */
    skipFile(item, force) {
      if (item.status === 0 && !force) {
        this.ui.fade("不能跳转到未标注数据");
        return false;
      }
      if (item.id !== this.files.curIndex) {
        const savePromise = this.saveResult(false);
        if (!savePromise) return;
        this.selectFile(item);
      }
    },
    // 下一条
    nextTask() {
      if (this.isOperationHistory) return;
      var file = this.getFile();
      if (this.Utils.isNull(file.next)) {
        this.ui.fade("已是最后一条");
        return false;
      }
      // 通知子元素 触发下一条
      this.$bus.$emit('nextTask')
      const savePromise = this.saveResult(false);
      if (savePromise) {
        // 下一条触发保存 自动异步
        this.selectFile(file.next);
      }
    },
    // 上一条
    preTask() {
      // 操作历史时
      if (this.isOperationHistory) return;
      var file = this.getFile();
      if (this.Utils.isNull(file.last)) {
        this.ui.fade("已是第一条");
        return false;
      }
      // 通知子元素 触发下一条
      this.$bus.$emit('preTask')
      const savePromise = this.saveResult(false);
      if (savePromise) {
        // 上一条触发保存 自动异步
        this.selectFile(file.last);
      }
    },
    // 标为坏数据或者好数据
    markBadData(e) {
      // 如果查看历史
      if (this.isOperationHistory) return false;
      var file = this.getFile();
      let { isBad, status } = file
      if (isBad == 0) {
        isBad = 1; // 修改当前文件状态
        const savePromise = this.saveResult(false);
        savePromise && savePromise.then(() => {
          status = 1; // 代表当前已经标注
          this.nextTask(); // 标坏自动跳转下一条
        });
      } else {
        isBad = 0;
      }
    },
    /**
     * 保存方法
     * @param isAuto 是否自动
     */
    async saveResult(isAuto) {
      let file = self.getFile();
      // 校验结果数据
      // if (!this.saveCheckData()) return false;
      this.$bus.$emit('saveBefore')
      if (this.saveCheckType === 0) return false; // 子组件校验失败
      this.saveCheckType = 0; // 重置校验标识

      let { result, id, isBad, saveSuccess, lastSubmit } = file

      let submitData = JSON.stringify(result);


      // 判断数值是否有更改
      // 自动 判断文本变化，无论上次是手动还是自动保存
      // 手动 上次是自动，则不比较文本变化，如果上次是手动则比较变化
      // 文本是否有变化，有变化保存，没有变化判断是否是自动保存和手动保存下上次也是手动保存
      // 2018/8/20 增加了判断 只有当文件
      let isNotNull = self.Utils.isNotNull
      if (
        isNotNull(lastSubmit) &&
        isNotNull(lastSubmit.result) &&
        lastSubmit.result == submitData
      ) {
        if (isAuto || lastSubmit.isLastAuto === isAuto) {
          // isAuto == true 或者 isAuto 和 lastIsAuto 都为false 表示上次也是手动存储的
          // ui.fade("结果已保存"); //没有变化只给提示
          lastSubmit.isLastAuto = isAuto;
          //  if(!isAuto){ file.status = 1;} // 如果是手动保存，则更改保存状态
          // success ? success() : "";
          // isOk = true;
          return Promise.resolve(true);
        }
      }

      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      var params = {
        lastIndex: id,
        result: {
          markTaskFileId: id,
          batchId: self.base.batchId,
          markTaskId: self.base.markTaskId,
          stamp: isBad,
          isCheck: false,
          resultText: submitData,
          autoSave: isAuto
        }
      };
      console.log(JSON.stringify(params),'submitData')

      file.saveSuccess = false; // 设置 保存状态
      self.interactive.saveSuccess = false; // 默认设置当前数据请求尚未保存成功
      // 先修改status代表已标注 测试
      return self.ass_api.saveResult({
        markTaskId: self.base.markTaskId,
        markFileId: id,
        recheck: self.base.recheck
      }, params).then(data => {
        if (data) {
          // 保存成功
          if (!isAuto) { // 手动保存
            file.status = 1;
          }
          file.saveSuccess = true;
          // 缓存本次保存结果
          file.lastSubmit = {
            isLastAuto: isAuto,
            result: submitData
          };
          return true;
        } else { // 保存失败
          file.saveSuccess = false; // 保存失败
          self.interactive.saveSuccess = true; // 数据请求成功
          return false;
        }
      })
    },
    // 主要用来调用保存方法
    async save() {
      const savePromise = self.saveResult(false);
      if (!savePromise) return; // 校验不通过
      let saveState = await savePromise // true 保存成功 false 保存失败
    },

    /**
     *  提交
     */
    async submitResult() {
      let { allInfo, showType } = this.files
      let { len } = allInfo
      function skipUnSave(_p) {
        if (showType != 1) {
          self.selectDataListType(1);
        }
        self.skipFile(_p, true);
      }

      function prejudgeSubmit() {
        for (var i = 0; i < len; i++) {
          var item = allInfo[i];
          let { status, name, saveSuccess } = item
          if (status == 0) {
            self.ui.fade(name + " 未完成标注,请完成标注后提交");
            skipUnSave(item);
            return false;
          }
          if (!saveSuccess) {
            self.ui.fade(name + " 保存失败，不能完成提交");
            skipUnSave(item);
            return false;
          }
        }
        return true;
      }
      const savePromise = self.saveResult(false);
      if (!savePromise) return; // 保存不通过
      let saveState = await savePromise
      if (self.base.step == 0) {
        if (saveState) { // 保存成功回调
          if (prejudgeSubmit()) {
            // 标注提交
            self.operate.isKeydownPrepare = false; // 2018/8/17 只有成功进入弹框
            self.ui.confirm("任务已完成，确认提交？").then(() => {
              self.operate.isKeydownPrepare = true; // 2018/8/17 成功后 取消
              self.ass_api.submitTask(self.base.markTaskId, "").then(() => {
                self.ui.fade("提交成功...");
                clearInterval(self.operate.autoSaveInterval);
                // self.history.submitsuccess = true;
                self.closeResult();
              });
            })
              .catch(() => {
                self.operate.isKeydownPrepare = true; // 2018/8/17 成功后 取消
              });
          }
        }
      } else if (self.base.step == 1) {
        // 检查提交
        if (saveState) {
          if (prejudgeSubmit()) {
            self.operate.isKeydownPrepare = false;
            // 检查提交弹窗
            self.ui.submit_comfirm(data => {
              if (!data.text) {
                self.ui.fade('请填写评价！')
                return false;
              }
              if (content.length < 4 || content.length > 100) {
                self.ui.fade('请输入规定范围文字个数4~100')
                return false;
              }
              var content = data.text.trim();
              self.ui.confirm("任务已完成，确认提交？").then(() => {
                self.operate.isKeydownPrepare = true;
                self.ass_api.submitTask(
                  self.base.markTaskId,
                  JSON.stringify({ isQualified: 0, evaluate: content })
                ).then(() => {
                  self.ui.fade("提交成功...");
                  clearInterval(self.operate.autoSaveInterval);
                  self.closeResult();
                });
              }).catch(() => {
                self.operate.isKeydownPrepare = true;
              });
              return true;
            }, () => {
              ass_api.error(err, self.base.step);
            }, 1)
          }
        }

      } else if (self.base.step == 2) {
        // 质检提交
        if (saveState) {
          if (prejudgeSubmit()) {
            self.operate.isKeydownPrepare = false;
            // 质检提交弹窗
            self.ui.submit_comfirm(data => {
              var content = data.text.trim();
              var isQualified = data.isQualified;
              if (!content) {
                self.ui.fade('请输入评价！')
                return false;
              }
              if (content.length < 4 || content.length > 100) {
                self.ui.fade('请输入规定范围文字个数4~100')
                return false;
              }
              self.ui.confirm("任务已完成，确认提交？").then(() => {
                self.operate.isKeydownPrepare = true;
                self.ass_api.submitTask(
                  self.base.markTaskId,
                  JSON.stringify({ isQualified, evaluate: content })
                ).then(() => {
                  self.ui.fade("提交成功...");
                  clearInterval(self.operate.autoSaveInterval);
                  self.closeResult();
                });
              }).catch(() => {
                self.operate.isKeydownPrepare = true; // 2018/8/17 只有成功进入弹框
              });
              return true;
            }, () => {
              self.operate.isKeydownPrepare = true; // 2018/8/17 只有成功进入弹框
              return true;
            }, 2)
          }
        }
      }
    },
    // 打回
    async repulse() {
      // 检查环节的打回操作
      const savePromise = self.saveResult(false);
      if (!savePromise) return;
      let saveState = await savePromise // true 保存成功 false 保存失败
      if (saveState) { // 保存成功 
        self.operate.isKeydownPrepare = true;
        self.ui
          .repulse_comfirm(data => {
            var content = data.text.trim();
            var isQualified = data.isQualified;
            if (!content) {
              self.ui.fade('请输入评价！')
              return false;
            }
            if (content.length < 4 || content.length > 100) {
              self.ui.fade('请输入规定范围文字个数4~100')
              return false;
            }
            if (self.base.step === 1) {
              // 主平台复检
              self.ass_api.submitTask(self.base.markTaskId,
                JSON.stringify({ isQualified: 1, evaluate: content }))
                .then(() => {
                  self.ui.successGoBase(
                    "打回成功..."
                  );
                  self.closeResult(self.base.step);
                });
            } else if (self.base.step === 2) {
              // 主平台复检
              self.ass_api
                .repulseTask(
                  self.base.markTaskId,
                  JSON.stringify({
                    isQualified: 1,
                    evaluate: content
                  })
                )
                .then(() => {
                  self.ui.successGoBase(
                    "打回成功..."
                  );
                  self.closeResult();
                });
            }
            self.operate.isKeydownPrepare = true;
            return true;
          }, () => {
            self.operate.isKeydownPrepare = true;
            return true;
          }
          )
      }
    },
    // 查看历史结果
    async viewVersion(item) {
      var fileId = self.getFile().id;
      self.history.show = false;
      self.history.showVersionInfo = true;
      await this.ass_api
        .getHistoryInfo(
          self.base.taskId,
          self.base.markTaskId,
          fileId,
          item.version
        )
        .then(info => {
          if (!info) return; //
          self.history.current = JSON.parse(info.resultText); // 当前历史数据
          self.history.beforeIsBad = self.files.current.isBad; // 保存之前的好坏数据
          self.history.beforeHistoryData = self.files.current.result; // 切换历史前的数据 简单的深拷贝
          // self.files.current.result = self.flatToTreeData(JSON.parse(item.resultText));
          self.$set(self.files.current, "result", JSON.parse(info.resultText));
          self.files.current.isBad = info.extend.stamp; // 好坏数据赋值
        });
    },

    // 恢复历史结果 (是否传入参数)
    async recoverVersion(pInfo) {
      var result = null;
      var fileId = self.getFile().id;
      if (self.Utils.isNull(pInfo)) {
      } else {
        await this.ass_api
          .getHistoryInfo(
            self.base.taskId,
            self.base.markTaskId,
            fileId,
            pInfo.version
          )
          .then(pInfo => {
            result = JSON.parse(pInfo.resultText);
            self.$set(self.files.current, "result", result); // 赋值
            self.files.current.isBad = pInfo.extend.stamp; // 好坏数据赋值
          });
      }
      self.saveResult(true); // 异步自动 无回调逻辑
      self.history.show = false;
      self.history.showVersionInfo = false;
    },
    // 关闭历史结果
    closeVersion: function () {
      self.history.show = false;
      self.history.showVersionInfo = false;
      self.history.current = {}; // 重新赋值 并不会影响到 原引用指向的值
      self.$set(self.files.current, "result", self.history.beforeHistoryData);
      self.files.current.isBad = self.history.beforeIsBad; // 恢复之前的好坏数据
      self.history.beforeHistoryData = {}; // 清空保存的数据
    },
    // 获取某个文件
    getFile: function (_fileIndex) {
      if (_fileIndex === undefined) {
        return self.files.current;
      }
      var len = self.files.showList.length;
      for (var i = 0; i < len; i++) {
        var item = self.files.showList[i];
        if (item.index == _fileIndex) {
          self.selectFile(item);
          return item;
        }
      }
      return null;
    },
    saveCheckData(isAuto) {
      var file = self.getFile();
      let { result } = file
      // isOk = false; // 返回值，通知是否可用继续执行
      if (!result) {
        if (isAuto) {
          return; // 没有结果
        } else {
          self.ui.fade("没有可保存任务");
          return;
        }
      }
      /**
       * 校验规则
       */

      var submitData = JSON.stringify(result);
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


      if (submitData === "{}") {
        return false;
      }
      return true;
    },
    // 关闭
    closeResult: function () {
      this.Utils.closeResult(self.base.step);
    },


    // 左侧列表显示隐藏
    changeFileList(listShowType) {
      this.listShow = listShowType;
    },
    // 隐藏头部
    hideHeader(showType) {
      this.arrowShow = showType;
    },
  },
  filters: {
  },
  components: {
    Header,
    CenterControl,
    FileList,
    HistoryPopup,
    MarkContent,
  }
};

</script>
     
<style scoped>
/* @import "../assets/css/jingxihua/index.css"; */
</style>
